/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Ventas.DAO;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Envios.DAO.EnviosDAO;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Cliente;
import pe.edu.pucp.Modelo.Configuracion;
import pe.edu.pucp.Modelo.Divisa;
import pe.edu.pucp.Modelo.Envio;
import pe.edu.pucp.Modelo.EstadoEnvio;
import pe.edu.pucp.Modelo.Impuesto;
import pe.edu.pucp.Modelo.Moneda;
import pe.edu.pucp.Modelo.NotaCredito;
import pe.edu.pucp.Modelo.Pago;
import pe.edu.pucp.Modelo.TipoCorreo;
import pe.edu.pucp.Modelo.TipoDocumento;
import pe.edu.pucp.Modelo.TipoPago;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Util.Calculo;
import pe.edu.pucp.Util.HibernateUtil;

/**
 *
 * @author pachon
 */
public class PagoDAO {
    
    public ArrayList<TipoPago> listarTipoPago(){
        ArrayList<TipoPago> lstTipoPago = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
  
        List lista = session.createQuery("from TipoPago").list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            TipoPago c = (TipoPago) iter.next();
            lstTipoPago.add(c);
        }
        tx.commit();
        session.close();        
        return lstTipoPago;
    }
    
    public ArrayList<TipoDocumento> listarTipoDocumentos(){
        ArrayList<TipoDocumento> lstTipoDocumento = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
  
        List lista = session.createQuery("from TipoDocumento").list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            TipoDocumento c = (TipoDocumento) iter.next();
            lstTipoDocumento.add(c);
        }
        tx.commit();
        session.close();        
        return lstTipoDocumento;
    }
    
    public ArrayList<NotaCredito> listarNotaCredito(Cliente cliente){
        ArrayList<NotaCredito> lstNotaCredito = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();     
        
        Query query = session.createQuery("select notacredito from NotaCredito notacredito where notacredito.envio.cliente.idcliente = :idCliente and notacredito.estadoNotaCredito.idestado = idEstado");
        query.setParameter("idCliente", cliente.getIdcliente());
        query.setParameter("idEstado", 1);
        List lista = query.list();        
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            NotaCredito c = (NotaCredito) iter.next();
            lstNotaCredito.add(c);
        }
        tx.commit();
        session.close();        
        return lstNotaCredito;
    }
    public Pago RegistrarPago(Usuario user, Envio envio, TipoPago tipopago, NotaCredito nota, double total){        
        Pago pago = new Pago();
        Moneda moneda = ObtenerMoneda(user);
        pago.setEnvio(envio);
        pago.setFechareg(new Date());
        pago.setUsuario(user);
        pago.setTipoPago(tipopago);
        pago.setMonto(total * moneda.getCambio());
        pago.setMoneda(moneda);
        EstadoEnvio estado = new EstadoEnvio();
        estado.setIdestado(2);//2 pagado
        envio.setEstadoEnvio(estado);
        EnviosDAO dao = new EnviosDAO();                
        Aeropuerto aero = dao.buscaAeropuerto(user.getAeropuerto().getCiudad());
        if (aero.getNumpack() == null){
            aero.setNumpack(envio.getNumpack());
        } else{
            aero.setNumpack(aero.getNumpack()+envio.getNumpack());
        }
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();     
        if(tipopago.getIdtipo()==3){
            nota.getEstadoNotaCredito().setIdestado(2);
            session.update(nota);
        }
        session.save(pago);
        session.update(aero);
        session.update(envio);
        tx.commit();
        session.close();           
        return pago;
    }
    public Moneda ObtenerMoneda(Usuario user){
        Moneda moneda = new Moneda();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();             
        Query query = session.createQuery("select divisa from Divisa divisa where divisa.pais.idpais = :idPais");
        query.setParameter("idPais", user.getAeropuerto().getCiudad().getPais().getIdpais());        
        List lista = query.list();        
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Divisa c = (Divisa) iter.next();    
            Hibernate.initialize(c.getMoneda().getCambio());
            moneda = c.getMoneda();            
        }
        tx.commit();
        session.close();
        return moneda;
    }
    
    public TipoPago ObtenerTipoPago(int id){
        TipoPago tipo = new TipoPago();
        tipo.setIdtipo(id);
        return tipo;
    }

    public double ObtenerCostoUnitario(Usuario user, Ciudad ciudad) {
        double costo;
        Calculo cal = new Calculo();
        Configuracion conf = new Configuracion();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();             
        Query query = session.createQuery("from Configuracion");        
        List lista = query.list();        
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            conf = (Configuracion) iter.next();                
        }
        tx.commit();
        session.close();
        Moneda mon = ObtenerMoneda(user);
        //
        costo = cal.CalculaTarifa(cal.Distancia(user.getAeropuerto().getCiudad(), ciudad)); 
        costo = cal.TarifaTipodeCambio(costo, mon);
        //
        return costo;
    }

    public double ObtenerTotal(double costoUnitario, int paquetes) {
        return costoUnitario * paquetes;
    }

    public double ObtenerIGV(Usuario user) {
        double IGV=0.0;
        Impuesto imp;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();     
        int d = user.getAeropuerto().getCiudad().getPais().getIdpais();
        Query query = session.createQuery("select impuesto from Impuesto impuesto where impuesto.pais.idpais = :idPais");
        query.setParameter("idPais", user.getAeropuerto().getCiudad().getPais().getIdpais());        
        List lista = query.list();        
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Impuesto c = (Impuesto) iter.next();
            IGV=Double.valueOf(c.getIva());
        }
        
        tx.commit();
        session.close();        
        return IGV;
    }

    public String obtenerServicio(double costoUnitario) {
        
        if (costoUnitario == 8){
             return "Tarifa A";           
        }
        else if(costoUnitario == 17){
             return "Tarifa B";
        }
        else if(costoUnitario == 33){
             return "Tarifa C";
        }
        else if(costoUnitario == 66){
             return "Tarifa D";
        }
        else {
             return "Tarifa E";
        }    
    }

    public String encontrarTipo(int tipoEmail) {
        String correo = "";
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();             
        Query query = session.createQuery("select tipo from TipoCorreo tipo where tipo.idtipocorreo = :idTipo");
        query.setParameter("idTipo", tipoEmail);        
        List lista = query.list();        
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            TipoCorreo c = (TipoCorreo) iter.next();
            correo = c.getExtension();
        }
        
        tx.commit();
        session.close();    
        return correo;
    }
    
}

